/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.code.config;

import vip.dexian.code.template.enums.TemplateEnum;
import org.apache.commons.lang3.tuple.Pair;

import java.util.ArrayList;
import java.util.List;

/**
 * 模板工具
 *
 * @author 挺好的 2023年06月06日 13:31
 */
public class TemplateUtils {

    private TemplateUtils () {
        this.templates = new ArrayList <>();
    }

    /**
     * 模板
     */
    private List <Template> templates;

    /**
     * 实体类class
     */
    private Class entityClass;

    /**
     * 模型数据
     */
    private ModelMap modelMap;

    /**
     * 创建一个Builder
     *
     * @return {@link TemplateUtils}
     */
    public static TemplateUtils builder () {
        return new TemplateUtils();
    }

    /**
     * 设置entityClass
     *
     * @param entityClass
     *         实体类的类型
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils entityClass (Class entityClass) {
        this.entityClass = entityClass;
        return this;
    }

    /**
     * 设置modelMap
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils modelMap () {

        ModelMap modelMap = ModelMap.builder().entityClass(this.entityClass).build().afterPropertiesSet();

        this.modelMap = modelMap;

        return this;
    }

    public TemplateUtils modelMap (String entityComment) {
        ModelMap modelMap = ModelMap.builder().entityClass(this.entityClass).entityComment(entityComment).build()
                .afterPropertiesSet();

        this.modelMap = modelMap;

        return this;
    }

    /**
     * 添加全部。
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils addAll (boolean isOverride, PathUtilsType pathUtilsType) {

        TemplateEnum[] enums = TemplateEnum.values();

        for (TemplateEnum templateEnum : enums) {
            this.add(templateEnum, isOverride, pathUtilsType);
        }

        return this;
    }

    /**
     * 添加dao
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils dao (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.DAO, isOverride, pathUtilsType);
    }

    /**
     * 添加daoImpl
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return
     */
    public TemplateUtils daoImpl (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.DAO_IMPL, isOverride, pathUtilsType);
    }

    /**
     * 添加 graph
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉。仅当 有 NamedEntityGraph 注解时，isOverride才生效
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils graph (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.GRAPH, isOverride, pathUtilsType);
    }

    /**
     * 添加graphdto
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils dto (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.DTO, isOverride, pathUtilsType);
    }

    /**
     * 添加 dtoMapper
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils dtoMapper (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.DTO_MAPPER, isOverride, pathUtilsType);
    }

    /**
     * 添加 service
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils service (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.SERVICE, isOverride, pathUtilsType);
    }

    /**
     * 添加 serviceImpl
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils serviceImpl (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.SERVICE_IMPL, isOverride, pathUtilsType);
    }

    /**
     * 添加 save form
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils saveForm (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.SAVE_FORM, isOverride, pathUtilsType);
    }

    /**
     * 添加 update form
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils updateForm (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.UPDATE_FORM, isOverride, pathUtilsType);
    }

    /**
     * 添加 page form
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils pageForm (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.PAGE_FORM, isOverride, pathUtilsType);
    }

    /**
     * 添加 list form
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils listForm (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.LIST_FORM, isOverride, pathUtilsType);
    }

    /**
     * 添加 save formMapper
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils saveFormMapper (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.SAVE_MAPPER, isOverride, pathUtilsType);
    }

    /**
     * 添加 update formMapper
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils updateFormMapper (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.UPDATE_MAPPER, isOverride, pathUtilsType);
    }

    /**
     * 添加 controller
     *
     * @param isOverride
     *         如果源文件存在，是否覆盖掉
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils controller (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.CONTROLLER, isOverride, pathUtilsType);
    }

    /**
     * SQL语句
     *
     * @param isOverride
     *
     * @return
     */
    public TemplateUtils sql (boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(TemplateEnum.SQL, isOverride, pathUtilsType);
    }

    /**
     * 添加模板
     *
     * @param templateEnum
     *         要生成的模板类型
     * @param isOverride
     *         如果源文件存在，是否覆盖。
     *
     * @return {@link TemplateUtils}
     */
    public TemplateUtils add (TemplateEnum templateEnum, boolean isOverride, PathUtilsType pathUtilsType) {
        return this.add(new Template(templateEnum, this.entityClass, isOverride, pathUtilsType));
    }


    /**
     * 返回要生成的模板
     *
     * @return {@link Template}
     */
    public Pair <List <Template>, ModelMap> build () {
        return Pair.of(this.templates, this.modelMap);
    }

    /**
     * 添加模板
     *
     * @param template
     *
     * @return {@link TemplateUtils}
     */
    private TemplateUtils add (Template template) {

        this.templates.add(template);

        return this;
    }


}
